package com.project.server;

import com.project.service.*;
import com.project.util.ServletFactory;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 *处理socket的线程类
 */
public class SocketThread implements Runnable{
    private Socket socket;
    private static String header = "HTTP/1.1 200 OK\r\n" +
            "Content-Type: text/html;charSet=utf-8\r\n" +
            "\r\n";
    public SocketThread(Socket socket) {
        this.socket = socket;
        //启动线程
        new Thread(this).start();
    }

    @Override
    public void run() {
        try {
            //请求响应模型
            //从socket中得到读取流,用于读取客户端发送的数据。
            InputStream is = socket.getInputStream();
            //从socket中得到写入流，用于将数据发送给客户端。
            OutputStream os = socket.getOutputStream();
            //将写入流封装成Response对象，以便更好地向客户端发送数据
            Response response = new Response(os);
            //将读取流封装成Requst对象，以便更好地读取数据
            Request request = new Request(is);


            //得到客户端访问资源的url路径
            String url = request.getUrl();
            //发送数据到客户端
            os.write(header.getBytes());
            //调用工厂方法，得到servlet对象
            Servlet servlet=ServletFactory.getServlet(url);
            if (servlet!=null){//客户端请求的是业务组件
                servlet.service(request,response);
            }

            else {//客户端请求的是文件
                response.sendFile(url);
            }
            //刷新，让数据真正写入
            os.flush();

            //关闭流
            os.close();
            is.close();
            socket.close();
        }catch (Exception e){
            throw new RuntimeException(e);
        }

    }
}
